<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2014 http://xxxx.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: songaimin <songaimin@clcw.com.cn> <http://blog.csdn.net/samxx8>
// +----------------------------------------------------------------------
namespace AuctionCore\Common;

/**
 * 汉字拼音缩写
 * User: sam
 * Date: 12-10-9
 * Time: 下午8:00
 * To change this template use File | Settings | File Templates.
 */
class ChineseSpell {
    /**
     * @var array $chineseSpellList 拼音编码对应表
     * @access private
     */
    private $chineseSpellList = array(
        'a' => - 20319 ,
        'ai' => - 20317 ,
        'an' => - 20304 ,
        'ang' => - 20295 ,
        'ao' => - 20292 ,
        'ba' => - 20283 ,
        'bai' => - 20265 ,
        'ban' => - 20257 ,
        'bang' => - 20242 ,
        'bao' => - 20230 ,
        'bei' => - 20051 ,
        'ben' => - 20036 ,
        'beng' => - 20032 ,
        'bi' => - 20026 ,
        'bian' => - 20002 ,
        'biao' => - 19990 ,
        'bie' => - 19986 ,
        'bin' => - 19982 ,
        'bing' => - 19976 ,
        'bo' => - 19805 ,
        'bu' => - 19784 ,
        'ca' => - 19775 ,
        'cai' => - 19774 ,
        'can' => - 19763 ,
        'cang' => - 19756 ,
        'cao' => - 19751 ,
        'ce' => - 19746 ,
        'ceng' => - 19741 ,
        'cha' => - 19739 ,
        'chai' => - 19728 ,
        'chan' => - 19725 ,
        'chang' => - 19715 ,
        'chao' => - 19540 ,
        'che' => - 19531 ,
        'chen' => - 19525 ,
        'cheng' => - 19515 ,
        'chi' => - 19500 ,
        'chong' => - 19484 ,
        'chou' => - 19479 ,
        'chu' => - 19467 ,
        'chuai' => - 19289 ,
        'chuan' => - 19288 ,
        'chuang' => - 19281 ,
        'chui' => - 19275 ,
        'chun' => - 19270 ,
        'chuo' => - 19263 ,
        'ci' => - 19261 ,
        'cong' => - 19249 ,
        'cou' => - 19243 ,
        'cu' => - 19242 ,
        'cuan' => - 19238 ,
        'cui' => - 19235 ,
        'cun' => - 19227 ,
        'cuo' => - 19224 ,
        'da' => - 19218 ,
        'dai' => - 19212 ,
        'dan' => - 19038 ,
        'dang' => - 19023 ,
        'dao' => - 19018 ,
        'de' => - 19006 ,
        'deng' => - 19003 ,
        'di' => - 18996 ,
        'dian' => - 18977 ,
        'diao' => - 18961 ,
        'die' => - 18952 ,
        'ding' => - 18783 ,
        'diu' => - 18774 ,
        'dong' => - 18773 ,
        'dou' => - 18763 ,
        'du' => - 18756 ,
        'duan' => - 18741 ,
        'dui' => - 18735 ,
        'dun' => - 18731 ,
        'duo' => - 18722 ,
        'e' => - 18710 ,
        'en' => - 18697 ,
        'er' => - 18696 ,
        'fa' => - 18526 ,
        'fan' => - 18518 ,
        'fang' => - 18501 ,
        'fei' => - 18490 ,
        'fen' => - 18478 ,
        'feng' => - 18463 ,
        'fo' => - 18448 ,
        'fou' => - 18447 ,
        'fu' => - 18446 ,
        'ga' => - 18239 ,
        'gai' => - 18237 ,
        'gan' => - 18231 ,
        'gang' => - 18220 ,
        'gao' => - 18211 ,
        'ge' => - 18201 ,
        'gei' => - 18184 ,
        'gen' => - 18183 ,
        'geng' => - 18181 ,
        'gong' => - 18012 ,
        'gou' => - 17997 ,
        'gu' => - 17988 ,
        'gua' => - 17970 ,
        'guai' => - 17964 ,
        'guan' => - 17961 ,
        'guang' => - 17950 ,
        'gui' => - 17947 ,
        'gun' => - 17931 ,
        'guo' => - 17928 ,
        'ha' => - 17922 ,
        'hai' => - 17759 ,
        'han' => - 17752 ,
        'hang' => - 17733 ,
        'hao' => - 17730 ,
        'he' => - 17721 ,
        'hei' => - 17703 ,
        'hen' => - 17701 ,
        'heng' => - 17697 ,
        'hong' => - 17692 ,
        'hou' => - 17683 ,
        'hu' => - 17676 ,
        'hua' => - 17496 ,
        'huai' => - 17487 ,
        'huan' => - 17482 ,
        'huang' => - 17468 ,
        'hui' => - 17454 ,
        'hun' => - 17433 ,
        'huo' => - 17427 ,
        'ji' => - 17417 ,
        'jia' => - 17202 ,
        'jian' => - 17185 ,
        'jiang' => - 16983 ,
        'jiao' => - 16970 ,
        'jie' => - 16942 ,
        'jin' => - 16915 ,
        'jing' => - 16733 ,
        'jiong' => - 16708 ,
        'jiu' => - 16706 ,
        'ju' => - 16689 ,
        'juan' => - 16664 ,
        'jue' => - 16657 ,
        'jun' => - 16647 ,
        'ka' => - 16474 ,
        'kai' => - 16470 ,
        'kan' => - 16465 ,
        'kang' => - 16459 ,
        'kao' => - 16452 ,
        'ke' => - 16448 ,
        'ken' => - 16433 ,
        'keng' => - 16429 ,
        'kong' => - 16427 ,
        'kou' => - 16423 ,
        'ku' => - 16419 ,
        'kua' => - 16412 ,
        'kuai' => - 16407 ,
        'kuan' => - 16403 ,
        'kuang' => - 16401 ,
        'kui' => - 16393 ,
        'kun' => - 16220 ,
        'kuo' => - 16216 ,
        'la' => - 16212 ,
        'lai' => - 16205 ,
        'lan' => - 16202 ,
        'lang' => - 16187 ,
        'lao' => - 16180 ,
        'le' => - 16171 ,
        'lei' => - 16169 ,
        'leng' => - 16158 ,
        'li' => - 16155 ,
        'lia' => - 15959 ,
        'lian' => - 15958 ,
        'liang' => - 15944 ,
        'liao' => - 15933 ,
        'lie' => - 15920 ,
        'lin' => - 15915 ,
        'ling' => - 15903 ,
        'liu' => - 15889 ,
        'long' => - 15878 ,
        'lou' => - 15707 ,
        'lu' => - 15701 ,
        'lv' => - 15681 ,
        'luan' => - 15667 ,
        'lue' => - 15661 ,
        'lun' => - 15659 ,
        'luo' => - 15652 ,
        'ma' => - 15640 ,
        'mai' => - 15631 ,
        'man' => - 15625 ,
        'mang' => - 15454 ,
        'mao' => - 15448 ,
        'me' => - 15436 ,
        'mei' => - 15435 ,
        'men' => - 15419 ,
        'meng' => - 15416 ,
        'mi' => - 15408 ,
        'mian' => - 15394 ,
        'miao' => - 15385 ,
        'mie' => - 15377 ,
        'min' => - 15375 ,
        'ming' => - 15369 ,
        'miu' => - 15363 ,
        'mo' => - 15362 ,
        'mou' => - 15183 ,
        'mu' => - 15180 ,
        'na' => - 15165 ,
        'nai' => - 15158 ,
        'nan' => - 15153 ,
        'nang' => - 15150 ,
        'nao' => - 15149 ,
        'ne' => - 15144 ,
        'nei' => - 15143 ,
        'nen' => - 15141 ,
        'neng' => - 15140 ,
        'ni' => - 15139 ,
        'nian' => - 15128 ,
        'niang' => - 15121 ,
        'niao' => - 15119 ,
        'nie' => - 15117 ,
        'nin' => - 15110 ,
        'ning' => - 15109 ,
        'niu' => - 14941 ,
        'nong' => - 14937 ,
        'nu' => - 14933 ,
        'nv' => - 14930 ,
        'nuan' => - 14929 ,
        'nue' => - 14928 ,
        'nuo' => - 14926 ,
        'o' => - 14922 ,
        'ou' => - 14921 ,
        'pa' => - 14914 ,
        'pai' => - 14908 ,
        'pan' => - 14902 ,
        'pang' => - 14894 ,
        'pao' => - 14889 ,
        'pei' => - 14882 ,
        'pen' => - 14873 ,
        'peng' => - 14871 ,
        'pi' => - 14857 ,
        'pian' => - 14678 ,
        'piao' => - 14674 ,
        'pie' => - 14670 ,
        'pin' => - 14668 ,
        'ping' => - 14663 ,
        'po' => - 14654 ,
        'pu' => - 14645 ,
        'qi' => - 14630 ,
        'qia' => - 14594 ,
        'qian' => - 14429 ,
        'qiang' => - 14407 ,
        'qiao' => - 14399 ,
        'qie' => - 14384 ,
        'qin' => - 14379 ,
        'qing' => - 14368 ,
        'qiong' => - 14355 ,
        'qiu' => - 14353 ,
        'qu' => - 14345 ,
        'quan' => - 14170 ,
        'que' => - 14159 ,
        'qun' => - 14151 ,
        'ran' => - 14149 ,
        'rang' => - 14145 ,
        'rao' => - 14140 ,
        're' => - 14137 ,
        'ren' => - 14135 ,
        'reng' => - 14125 ,
        'ri' => - 14123 ,
        'rong' => - 14122 ,
        'rou' => - 14112 ,
        'ru' => - 14109 ,
        'ruan' => - 14099 ,
        'rui' => - 14097 ,
        'run' => - 14094 ,
        'ruo' => - 14092 ,
        'sa' => - 14090 ,
        'sai' => - 14087 ,
        'san' => - 14083 ,
        'sang' => - 13917 ,
        'sao' => - 13914 ,
        'se' => - 13910 ,
        'sen' => - 13907 ,
        'seng' => - 13906 ,
        'sha' => - 13905 ,
        'shai' => - 13896 ,
        'shan' => - 13894 ,
        'shang' => - 13878 ,
        'shao' => - 13870 ,
        'she' => - 13859 ,
        'shen' => - 13847 ,
        'sheng' => - 13831 ,
        'shi' => - 13658 ,
        'shou' => - 13611 ,
        'shu' => - 13601 ,
        'shua' => - 13406 ,
        'shuai' => - 13404 ,
        'shuan' => - 13400 ,
        'shuang' => - 13398 ,
        'shui' => - 13395 ,
        'shun' => - 13391 ,
        'shuo' => - 13387 ,
        'si' => - 13383 ,
        'song' => - 13367 ,
        'sou' => - 13359 ,
        'su' => - 13356 ,
        'suan' => - 13343 ,
        'sui' => - 13340 ,
        'sun' => - 13329 ,
        'suo' => - 13326 ,
        'ta' => - 13318 ,
        'tai' => - 13147 ,
        'tan' => - 13138 ,
        'tang' => - 13120 ,
        'tao' => - 13107 ,
        'te' => - 13096 ,
        'teng' => - 13095 ,
        'ti' => - 13091 ,
        'tian' => - 13076 ,
        'tiao' => - 13068 ,
        'tie' => - 13063 ,
        'ting' => - 13060 ,
        'tong' => - 12888 ,
        'tou' => - 12875 ,
        'tu' => - 12871 ,
        'tuan' => - 12860 ,
        'tui' => - 12858 ,
        'tun' => - 12852 ,
        'tuo' => - 12849 ,
        'wa' => - 12838 ,
        'wai' => - 12831 ,
        'wan' => - 12829 ,
        'wang' => - 12812 ,
        'wei' => - 12802 ,
        'wen' => - 12607 ,
        'weng' => - 12597 ,
        'wo' => - 12594 ,
        'wu' => - 12585 ,
        'xi' => - 12556 ,
        'xia' => - 12359 ,
        'xian' => - 12346 ,
        'xiang' => - 12320 ,
        'xiao' => - 12300 ,
        'xie' => - 12120 ,
        'xin' => - 12099 ,
        'xing' => - 12089 ,
        'xiong' => - 12074 ,
        'xiu' => - 12067 ,
        'xu' => - 12058 ,
        'xuan' => - 12039 ,
        'xue' => - 11867 ,
        'xun' => - 11861 ,
        'ya' => - 11847 ,
        'yan' => - 11831 ,
        'yang' => - 11798 ,
        'yao' => - 11781 ,
        'ye' => - 11604 ,
        'yi' => - 11589 ,
        'yin' => - 11536 ,
        'ying' => - 11358 ,
        'yo' => - 11340 ,
        'yong' => - 11339 ,
        'you' => - 11324 ,
        'yu' => - 11303 ,
        'yuan' => - 11097 ,
        'yue' => - 11077 ,
        'yun' => - 11067 ,
        'za' => - 11055 ,
        'zai' => - 11052 ,
        'zan' => - 11045 ,
        'zang' => - 11041 ,
        'zao' => - 11038 ,
        'ze' => - 11024 ,
        'zei' => - 11020 ,
        'zen' => - 11019 ,
        'zeng' => - 11018 ,
        'zha' => - 11014 ,
        'zhai' => - 10838 ,
        'zhan' => - 10832 ,
        'zhang' => - 10815 ,
        'zhao' => - 10800 ,
        'zhe' => - 10790 ,
        'zhen' => - 10780 ,
        'zheng' => - 10764 ,
        'zhi' => - 10587 ,
        'zhong' => - 10544 ,
        'zhou' => - 10533 ,
        'zhu' => - 10519 ,
        'zhua' => - 10331 ,
        'zhuai' => - 10329 ,
        'zhuan' => - 10328 ,
        'zhuang' => - 10322 ,
        'zhui' => - 10315 ,
        'zhun' => - 10309 ,
        'zhuo' => - 10307 ,
        'zi' => - 10296 ,
        'zong' => - 10281 ,
        'zou' => - 10274 ,
        'zu' => - 10270 ,
        'zuan' => - 10262 ,
        'zui' => - 10260 ,
        'zun' => - 10256 ,
        'zuo' => - 10254
    );

    protected $_code;

    public function __construct($code = null)
    {
        if($code !==null){
            $this->_code = $code;
        }else{
            $this->_code = 'utf8';
        }
    }

    /**
     * 取汉字所有拼音
     * @param string $chinese 要转换的汉字
     * @param string $delimiter 分隔符
     * @param int $length 返回的长度
     * @return string
     */
    public function getFullSpell ($chinese, $delimiter = ' ', $length = 0)
    {
        $spell = $this->getChineseSpells($chinese, $delimiter);
        if ($length) {
            $spell = substr($spell, 0, $length);
        }
        return $spell;
    }

    /**
     * 取汉字第一个拼音
     * @param string $chinese 要转换的汉字
     * @param int $length 返回的长度
     * @return string
     */
    public function getFirstSpell ($chinese, $length = 0)
    {
        $spell = $this->getChineseSpells($chinese, ' ', 1);
        if ($length) {
            $spell = substr($spell, 0, $length);
        }
        return $spell;
    }

    /**
     * 取一个汉字码对应的拼音
     * @param int $num 汉字码
     * @param string $blank 空白字符
     * @return string
     */
    private function getChineseSpell ($num, $blank = '')
    {
        if ($num > 0 && $num < 160) {
            return chr($num);
        } elseif ($num < - 20319 || $num > - 10247) {
            return $blank;
        } else {
            foreach ($this->chineseSpellList as $spell => $code) {
                if ($code > $num)
                    break;
                $result = $spell;
            }
            return $result;
        }
    }

    /**
     * 取汉字拼音
     * @param string $chinese 要转换的汉字
     * @param string $delimiter 分隔符
     * @param int $first 是否只返回第一个
     * @return string
     */
    private function getChineseSpells ($chinese, $delimiter = ' ', $first = 0)
    {
        if($this->_code == 'utf8'){
            $chinese = $this->gbk2utf8($chinese);
        }
        $result = array();
        for ($i = 0; $i < strlen($chinese); $i ++) {
            $p = ord(substr($chinese, $i, 1));
            if ($p > 160) {
                $q = ord(substr($chinese, ++ $i, 1));
                $p = $p * 256 + $q - 65536;
            }
            $result[] = $this->getChineseSpell($p);
            if ($first) {
                return $result[0];
            }
        }
        $_Res = implode($delimiter, $result);
        $_Res = preg_replace("/[^a-z0-9_$delimiter]/", '', $_Res);
        return trim($_Res,"$delimiter");
    }

    /**
     * 获得拼音首字母缩写
     */
    public function getFirstLetter($str){
        $fullpy=$this->getFullSpell($str);
        $fullPyArr=explode(' ',$fullpy);
        $fristStr='';
        foreach($fullPyArr as $pyOne){
            $fristStr.=substr($pyOne,0,1);
        }
        return $fristStr;
    }

    private function gbk2utf8($string)
    {
        $_String = '';
        if($string < 0x80) $_String .= $string;
        elseif($string < 0x800)
        {
            $_String .= chr(0xC0 | $string>>6);
            $_String .= chr(0x80 | $string & 0x3F);
        }elseif($string < 0x10000){
            $_String .= chr(0xE0 | $string>>12);
            $_String .= chr(0x80 | $string>>6 & 0x3F);
            $_String .= chr(0x80 | $string & 0x3F);
        } elseif($string < 0x200000) {
            $_String .= chr(0xF0 | $string>>18);
            $_String .= chr(0x80 | $string>>12 & 0x3F);
            $_String .= chr(0x80 | $string>>6 & 0x3F);
            $_String .= chr(0x80 | $string & 0x3F);
        }
        return iconv('UTF-8', 'GB2312', $_String);
    }

}
